/**
 * 无符号整型 https://book.kotlincn.net/text/unsigned-integer-types.html
 */
fun main81() {
    /**
     * 除了整数类型，对于无符号整数，Kotlin 还提供了以下类型：
     * UByte : 无符号 8  比特整数，范围是 0 到 255
     * UShort: 无符号 16 比特整数，范围是 0 到 65535
     * UInt  : 无符号 32 比特整数，范围是 0 到 2^32 - 1
     * ULong : 无符号 64 比特整数，范围是 0 到 2^64 - 1
     *
     * 无符号数实现为具有单个存储属性的内联类， 该属性类型为与其宽度相同的对应有符号类型。
     * 尽管如此，将类型从无符号类型更改为对应的有符号类型（反之亦然） 是二进制不兼容变更。
     */
}


/**
 * 无符号数组与区间
 */
fun main82() {
    //无符号数组及其对应操作处于 Beta 状态。 它们可能随时进行不兼容变更。 需要选择加入（详见下文）。
    /**
     * UByteArray : 无符号字节数组
     * UShortArray: 无符号短整型数组
     * UIntArray  : 无符号整型数组
     * ULongArray : 无符号长整型数组
     */
    //与有符号整型数组一样，它们提供了类似于 Array 类的 API 而没有装箱开销。
    //区间与数列也支持 UInt 与 ULong（通过这些类 UIntRange、 UIntProgression、 ULongRange、 ULongProgression）。
}


/**
 * 无符号整数字面值
 */
fun main83() {
    //为使无符号整型更易于使用，Kotlin 提供了用后缀标记整型字面值来表示指定无符号类型（类似于 Float 或 Long）：
    val b: UByte = 1u   // UByte，已提供预期类型
    val s: UShort = 1u  // UShort，已提供预期类型
    val l: ULong = 1u   // ULong，已提供预期类型

    val a1 = 42u                // UInt：未提供预期类型，常量适于 UInt
    val a2 = 0xFFFF_FFFF_FFFFu  // ULong：未提供预期类型，常量不适于 UInt

    val a = 1UL // ULong，即使未提供预期类型并且常量适于 UInt



}


/**
 * 使用场景
 */
fun main84() {
    data class Color(val representation: UInt)
    val yellow = Color(0xFFCC00CCu)

    //You can use unsigned numbers to initialize byte arrays without explicit toByte() literal casts:
    val byteOrderMarkUtf8 = ubyteArrayOf(0xEFu, 0xBBu, 0xBFu)
}


/**
 * 非目标
 */
fun main85() {
    /**
     * Using signed integers can help to detect accidental overflows and signal error conditions,
     * such as List.lastIndex being -1 for an empty list.
     */
}